package bean.dao;

import java.util.List;

import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import dominio.Rodamiento;

public class HibernateRodamientoDAO {
	
	private static HibernateRodamientoDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;
	
	public static HibernateRodamientoDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateRodamientoDAO();
		} 
		return instancia;
	}
	
	private Session getSession(){
		if(session == null)
			session = sf.openSession();
		return session;
	}
	
	public void closeSession(){
		if (session != null) session.close();
	}

	public List<Rodamiento> getListaRodamientos(String sufijo, String marca,
			String nroSerie, String origen, int cant) {
		
		Session s = getSession();
		List<Rodamiento> rodamientos =  s.createQuery("from Rodamiento r " +
				"where r.Sufijo = "+sufijo+ " and " +
						"r.Marca = "+ marca + " and "+
						"r.Serie = "+ nroSerie + " and "+
						"r.Pais = " + origen).list();
		
		/*
		 *  Para que no aplique el filtro en caso de no pasar el parametro
		 * hay que ir armando el query
		 * 
		 * where 
		 * if(sufijo.length() > 0)
		 * {
		 * 		r.Sufijo like '%"+sufijo+"%'
		 * }
		 */
		
		
		return rodamientos;
	}


	
	
	/*********************************************AMB DE RODAMIENTOS**********************************************************/
	
	
	public void agregarRodamiento(Rodamiento r) {
		Session s = getSession();
		s.beginTransaction();
		s.persist(r);
		s.flush();
		s.getTransaction().commit();
		
	}

	public boolean mismoRodamiento(String numeroSerie, String sufijo,String marca, String origen) {
		
		Session s= getSession();
		Rodamiento r= (Rodamiento) s.getNamedQuery("mismoRodamiento").setString("ns", numeroSerie).setString("s", sufijo).
									setString("m", marca).setString("o", origen).uniqueResult();
		if(r==null)
			return false;
		else
			return true;
		
	}

	public int ultimoIdRodamiento() {
		Session s= getSession();
		int i= (Integer) s.createQuery("select max(r.idRodamiento) from Rodamiento r").uniqueResult();
		return i;
	}

	@SuppressWarnings("unchecked")
	public List<Integer> rodamientosId() {
		
		Session s= getSession();
		List<Integer> lista = s.createQuery("select r.idRodamiento from Rodamiento r").list();
		return lista;
	}

	public Rodamiento getRodamiento(int id) {
		Session s=getSession();
		Rodamiento r= (Rodamiento) s.createQuery("select r from Rodamiento r where r.idRodamiento="+id).uniqueResult();
		s.clear();
		return r;
	}

	public void eliminarRodamiento(int id) {

		Session s= getSession();
		Rodamiento r= (Rodamiento) s.createQuery("select r from Rodamiento r where idRodamiento="+id).uniqueResult();
		s.beginTransaction();
		s.delete(r);
		s.flush();
		s.getTransaction().commit(); 
		s.clear();
		
		
	}
	
	public Rodamiento getMismoRodamiento(String numeroSerie, String sufijo,String marca, String origen) {
		
		Session s= getSession();
		Rodamiento r= (Rodamiento) s.getNamedQuery("mismoRodamiento").setString("ns", numeroSerie).setString("s", sufijo).
									setString("m", marca).setString("o", origen).uniqueResult();
		return r;		
	}
	
		
		
		
		
	

	public void modificarRodamiento(int id,String ns, String s, String m, String o,
			String c,float p, int cant) {
		Session se=getSession();
		se.beginTransaction();
	
		Rodamiento r= new Rodamiento();
		r.setIdRodamiento(id);
		r.setNumeroSerie(ns);
		r.setSufijo(s);
		r.setMarca(m);
		r.setOrigen(o);
		r.setPrecio(p);
		r.setStock(cant);
		r.setCaracteristica(c);
		se.update(r);
		se.flush();
		se.getTransaction().commit();
		se.clear();
		
		
	}	
	
	
	
	
	
}
